# -*- coding: utf-8 -*-
# @Time     : 2021/11/27 15:11
# @Author   : wljess
# @File     : 上下文管理器捕获异常.py
# @Describe : 
# @Software : PyCharm

class Context:

    def __init__(self, name, mode):
        self.name = name
        self.mode = mode
        # 文件句柄，资源对象
        self.file_handle = None

    def __enter__(self):
        # 进入上下文管理器的运行时上下文,获取资源
        print("__enter__")
        self.file_handle = open(self.name, self.mode)
        return self.file_handle

    def __exit__(self, exc_type, exc_val, exc_tb):
        '''
        :param exc_type: 异常类型
        :param exc_val: 异常值
        :param exc_tb: 异常回溯追踪
        :return:
        '''
        # 退出上下文管理器的运行时上下文，释放资源
        print("__exit__")
        if exc_val:
            print(exc_type)
            print(exc_tb)
            print(exc_val)

        self.file_handle.close()

        return True


with Context("info.txt", 'r') as f:
    print("业务逻辑主体部分")
    # 调用不存在的undefinded_method方法时，抛出了异常
    f.undefinded_method("Bye")

'''
__exit__()方法中捕捉的异常，实际上是with语句体(with代码块)所抛出的异常，默认__exit__()方法返回值为None,
若__exit__()方法返回 True，则说明该异常已被“处理”，无需再处理
若__exit__()方法返回 True 之外的任何内容，则该异常将被 with 语句抛出
'''